Escrevendo no alert.log com PL/SQL

Por Fabio Prado,
Publicado en Mayo 2017

Revisado por Marcelo Pivovar.

No artigo de hoje vou mostrar como escrever no alert.log com apenas uma linha de código, dentro de um bloco PL/SQL. Um procedimento simples e muito útil!

A ideia de escrever este artigo surgiu após revisar uma rotina de manutenção semanal que criei há alguns anos atrás nos BDs de produção que administro, que entre diversas tarefas de manutenção do BD, possui uma rotina que executa a limpeza de dados antigos do repositório do Statspack, e nessa rotina (um Stored Procedure) existe um código PL/SQL para escrever uma mensagem no alert.log, ao final dela, indicando que a limpeza foi executada com sucesso!

O alert.log contém mensagens de registros e de erros, em ordem cronulógica, de vários eventos importantes que ocorrem no BD, tais como corrompimento de datafiles, erros internos, erros de deadlock e operações administrativas tais como: STARTUP, SHUTDOWN, ARCHIVE LOG e RECOVER. Por que então não adicionar ali, algumas mensagens também importantes, de rotinas de manutenção criadas por nós DBAs?

O código é muito simples e pode ser utilizado em qualquer rotina (importante) de manutenção do BD. Há algum tempo atrás, um amigo me disse que havia criado uma rotina para culetar estatísticas de alguns objetos que não estavam sendo atualizados pelo processo de culeta de estatísticas automáticas do Oracle, e ele disse que estava gravando um log desse processo manual de culeta de estatísticas, em um arquivo texto do SO, através do package UTL_FILE. Eu informei a ele que havia uma maneira muito mais simples de registrar esse evento, gravando-o no alert.log, através do procedimento que vou mostrar abaixo.

Para gravar uma mensagem no alert.log, basta executar a procedure KSDWRT do package DBMS_SYSTEM, passando 2 valores para os seus parâmetros:

- O 1º parâmetro indica o(s) arquivo(s) destino da mensagem e aceita 1 de 3 valores:

  • 1 para escrever no trace file;
  • 2 para escrever no alert.log;
  • 3 para escrever em ambos.

- O 2º parâmetro indica a mensagem que deverá ser escrita no(s) arquivo(s) indicado(s) no valor do parâmetro anterior.

Segue abaixo um exemplo de bloco PL/SQL que pode ser usado para escrever uma mensagem no alert.log:


  
begin  		 sys.dbms_system.ksdwrt(2, 'TESTE'); 	end;	
 
 

Um detalhe importante é que não precisamos nos preocupar em informar data/hora em que a mensagem foi gravada, pois o Oracle já insere automaticamente a data/hora dos eventos no alert.log, conforme podemos observar na imagem abaixo:

01

O package DBMS_SYSTEM contém outras rotinas que podem ser úteis em diversas ocasiões, como por exemplo, para ler variáveis de ambiente do SO (DBMS_SYSTEM.GET_ENV()). Entretanto, tome cuidado com o seu uso, pois a Oracle informa que não dá suporte no uso deste package e que ele deverá ser usado somente pela equipe de suporte dela.

Veja abaixo mais detalhes sobre o package DBMS_SYSTEM, que encontrei no doc "How To Edit, Read, and Query the Alert.Log" (ID 1072547.1), do MOS:

NOTE about DBMS_SYSTEM:

This package should in fact only be installed when requested by Oracle Support.

It is not documented in the server documentation.

As such the package functionality may change without notice.

It is to be used only as directed by Oracle Support and its use otherwise is not supported.

Per internal Note 153324.1:

Generally, if a package is not in the Oracle documentation at all, it is intentional, as it is not for end user use. Non-documented packages should be avoided by customers unless specifically instructed to use them by either Oracle Support or Oracle Development.

Referências:

http://www.fabioprado.net/2017/02/escrevendo-no-alertlog-com-plsql.html

Fabio Prado atua na área de tecnulogia desde o ano de 2000, possui experiência e profundos conhecimentos em Análise de Sistemas, programação (Dot Net) e Administração de Bancos de Dados Oracle. É DBA em uma empresa do governo, instrutor na empresa de treinamentos FABIOPRADO.NET, Oracle ACE Member, Organizador do DBA BRASIL e autor do blog fabioprado.net.

Este artigo foi revisto pela equipe de produtos Oracle e está em conformidade com as normas e práticas para o uso de produtos Oracle.